package com.example.demo.config.exception;

import com.example.demo.common.entity.JsonResult;
import com.example.demo.common.entity.JsonResultStatus;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.http.HttpStatus;
import org.springframework.web.bind.MethodArgumentNotValidException;
import org.springframework.web.bind.annotation.ControllerAdvice;
import org.springframework.web.bind.annotation.ExceptionHandler;
import org.springframework.web.bind.annotation.ResponseStatus;
import org.springframework.web.bind.annotation.RestController;

/**
 * Created by Mojo on 2017/9/5.
 * 全局异常处理器 (验证失败会抛出MethodArgumentNotValidException 异常，可以捕获这个异常)
 *
 * 通过使用@ControllerAdvice定义统一的异常处理类，而不是在每个Controller中逐个定义。
 * @ExceptionHandler用来定义函数针对的异常类型
 * @ResponseStatus注解，可以修饰一个异常类，在发生异常的时候返回指定的错误码和消息
 */
@ControllerAdvice
@RestController
public class GlobalExceptionHandler {

	private Logger logger = LoggerFactory.getLogger(this.getClass());

	/**
	 * 数据参数验证
	 * @param e
	 * @return
	 * @throws Exception
	 */
	@ExceptionHandler(value = MethodArgumentNotValidException.class)
//	@ResponseStatus(value= HttpStatus.EXPECTATION_FAILED,reason="数据参数验证失败")
	public JsonResult validateHandler(MethodArgumentNotValidException e) throws Exception{
		JsonResult jsonResult = new JsonResult();
		jsonResult.setRet(JsonResultStatus.RET_EXCEPTION);
		jsonResult.setMsg(e.getBindingResult().getFieldError().getDefaultMessage());
		logger.error("数据参数验证异常",e);
		return jsonResult;
	}

}
